package com.albaba.designpattern.beans;

import com.albaba.designpattern.beans.support.BeanDefinitionReader;
import com.albaba.designpattern.beans.support.BeanDefinitionRegistry;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zx
 * @version 1.0
 * @description Application接口的子类实现类
 * 在创建容器对象时加载配置文件，对Bean进行初始化
 * @date 2025/3/8 20:20
 */
public abstract class AbstractApplicationContext implements ApplicationContext {

    // 声明解析器变量
    protected BeanDefinitionReader beanDefinitionReader;

    // 存储 bean 对象的 Map 集合
    protected Map<String,Object> singletonObjects = new HashMap<>();

    // 声明一个配置文件路径变量
    protected String configLocation;

    @Override
    public void refresh() {

        // 加载BeanDefinition对象
        try {
            beanDefinitionReader.loadBeanDefinitions(configLocation);

            // 初始化方法
            finishInitialization();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // bean 的初始化
    private void finishInitialization() throws Exception {
        // 获取注册表对象
        BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry();

        // 获取 BeanDefinition 对象
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();

        for (String beanDefinitionName : beanDefinitionNames) {
            getBean(beanDefinitionName);
        }
    }
}
